<!--
描述：简单示例页面
作者：吕凯 <253044554@qq.com> 2021-8-4 16:00:00
-->
<!DOCTYPE html>
<html>
<head>
	<title>新闻</title>
	<meta http-equiv="Content-type" content="text/html;charset=UTF-8" />	
	<meta name="keywords" content="新闻">
	<link href="../src/touchnote.css?20210421115725" rel="stylesheet">	
	<style type="text/css">

	</style>
</head>

<body>
	<div class="container">
		<nav class="navbar navbar-default navbar-fixed-top"></nav>
		<div class="text-highlight" id="text-highlight">
			<p>词图的生成</p>
			<p>当分词系统有一份词典的时候，就可以生成词图了。所谓词图，指的是句子中所有词可能构成的图。如果一个词A的下一个词可能是B的话，那么A和B之间具有一条路径E(A,B)。一个词可能有多个后续，同时也可能有多个前驱，它们构成的图我称作词图。</p>					
			<h2>词图的生成</h2>
			<p>需要稀疏2维矩阵模型，以一个词的起始位置作为行，终止位置作为列，可以得到一个二维矩阵。例如：“他说的确实在理”这句话</p>
			<p><img src="http://ww3.sinaimg.cn/large/6cbb8645gw1eghe5t76jrg20cs06dmwz.gif" alt=""></p>
			<p>那么如何建立节点之间的联系呢？也就是如何找到一个词A的后续B、C、D……呢？有两种已实现的方法，一种是所谓的DynamicArray法，一种是快速offset法。</p>
			<h3>1.DynamicArray法</h3>
			<p>最直截了当的想法当然是用二维数组模拟这个模型了，很明显，其中有不少空洞，所以在ICT系列的分词器中定义了一个蹩脚的DynamicArray结构用来储存模型，DynamicArray结构的每个节点包含一个个词的row和col，待会儿看完offset法你就会明白我什么么说DynamicArray蹩脚。</p>
			<p>在这张图中，行和列有一个非常有意思的关系：col为 n 的列中所有词可以与row为 n 的所有行中的词进行组合。例如“的确”这个词，它的col = 5，需要和它计算平滑值的有两个，分别是row = 5的两个词：“实”和“实在”。</p>
			<p>连接词形成边的时候，利用上面提到的关系即可。</p>
			<p>但是在遍历和插入的时候，需要一个个比较col和row的关系，复杂度是O(N)。</p>
			<h3>2.快速offset</h3>
			<p>虽然模型的表示用DynamicArray没有信息的损失，但问题是，真的需要表示模型吗？</p>
			<p>当然不，我可以将起始offset相同的词写到一行：</p>
			<pre><code>始##始
他
说
的/的确
确/确实
实/实在
在/在理
理
末##末
</code></pre>
			<p>这个储存起来很简单，一个一维数组，每个元素是一个单链表。</p>
			<p>怎么知道“的确”的下一个词是什么呢？“的确”的行号是4,长度是2,4+2=6，于是第六行的两个词“实/实在”就是“的确”的后续。就这么简单。</p>
			<p>同时这种方法速度非常快，插入和查询的时间都是O(1)。</p>					
			<h2>小结</h2>
			<p>MISS是设计的准则，不需要新定义那么复杂的数据结构。ICT作者为何定义那么复杂的DynamicArray，写了那么多曲曲折折的代码就不知道了。</p>
			<h2>Reference</h2>
			<p><a href="http://www.cnblogs.com/zhenyulu/articles/668035.html" target="blank">http://www.cnblogs.com/zhenyulu/articles/668035.html</a></p>
			<p><a href="http://blog.csdn.net/sinboy/article/details/663123" target="blank">http://blog.csdn.net/sinboy/article/details/663123</a></p>
		</div>		
	</div>
	<script type="text/javascript" src="js/jquery-1.12.4.min.js?20191016082530"></script>
	<!-- 备注【必需】 -->
	<script type="text/javascript" src="../src/touchnote.js?20210712162526" ></script>
	
	<!-- 代码审查 -->
	<script>
		// 初始数据
		var notesdata = [{'nid':'1', 'keyid':"tn-1628153524469",'keycode':{"startMeta":{"parentTagName":"DIV","parentIndex":-2,"textOffset":41},"endMeta":{"parentTagName":"DIV","parentIndex":-2,"textOffset":56},"text":"指的是句子中所有词可能构成的图","id":"tn-1628153524469"}, 'remarks':'图片', 'userid':2, 'username':'兔先生', 'createtime':'2021-07-05 09:12:17.0'},
		{'nid':'2', 'keyid':"h1625464240253",'keycode':{"startMeta":{"parentTagName":"DIV","parentIndex":-2,"textOffset":64},"endMeta":{"parentTagName":"DIV","parentIndex":-2,"textOffset":68},"text":"下一个词","id":"tn-1628153598413"}, 'remarks':'下一个词<span>带标签', 'userid':3, 'username':'超超', 'createtime':'2021-07-05 13:51:01.0'}];
		
		var highlightEle = $("#text-highlight");
		highlightEle.touchNote({
			root:highlightEle[0],
			/** 父节点选择器，只有符合选择器的才作为父节点 */
			parSelectors : 'div', // 父节点，作为位置偏移的基准，保存后不可改变，否则可能影响定位
			hldatas : notesdata //初始化数据
		});
	</script>
</body>
</html>
